/*
 *    This program is free software; you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation; either version 2 of the License, or
 *    (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with this program; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *    2010 year
 *    Author: Michael Khromov aka MikeDM (Mike D'Morto)
 *    E-Mail: mikedmorto@gmail.com
 */


#include "tspl_login_std_mng.h"
#include "def.h"
#include <QTranslator>

bool Tspl_login_std_mng::qinit(const QString &cfgstr,const QString & lang,
                               const QString & curruser, const QString & filebase,
                               QList<TsIfaceWrkPlugin*> * pllist){
    // устанавливаем локализацию
    emit this->sigPutLog(PLUGIN_NAME,2,QString("start translate %1").arg(lang));
    QTranslator * trans = new QTranslator();
    if(trans->load(QString(":/%1/lang/%2.qm").arg(PLUGIN_NAME).arg(lang))){
        emit this->sigPutLog(PLUGIN_NAME,2,QString("success translate %1").arg(lang));
        QCoreApplication::installTranslator(trans);
    }else{
        emit this->sigPutLog(PLUGIN_NAME,2,QString("fail translate %1").arg(lang));
    }
    // принимаем строку параметров.
    // разбиваем на параметры
    // параметры по умолчанию
    this->mode=false;
    this->Step=Tspl_login_std_mng::InitUser;

    emit this->sigPutLog(PLUGIN_NAME,3,"Debug: parse parameters");
    QStringList pr=cfgstr.split(",");
    for(int i = 0; i < pr.size(); i++){
        emit this->sigPutLog(PLUGIN_NAME,3,"Debug: parameter "+QString::number(i)+"="+pr.at(i));
        if(QString(pr.at(i)).split("=").at(0)=="type"){
            // нашли в конфиге тип диалога.
                if(QString(pr.at(i)).split("=").at(1) == "all"){
                    this->mode=true;
                    this->Step=Tspl_login_std_mng::InitAdm;
                }
        }
    }

    // создаем диалоги и связываем с собой.
    // важно! каждый плагин создает свои диалоги во время инициализации.
    // а вот уже диалоги от этих диалогов как хотят.
    this->mcurruser=curruser;
    dia = new DLoginStdMng(this->mode,this->mcurruser);
    connect(dia,SIGNAL(sigChangeUP(QString)),SLOT(slotChangeUP(QString)));
    connect(dia,SIGNAL(sigGetAllUsers()),SLOT(slotGetAllUsers()));
    connect(dia,SIGNAL(sigChangeUPA(QString,QString)),SLOT(slotChangeUPA(QString,QString)));
    return true;
}

bool Tspl_login_std_mng::qstart(){
    // запускаем работу с диалогом.
    return dia->dstart();
}

// пришел запрос на смену пароля текущего пароля пользователя, режим пользователя
void Tspl_login_std_mng::slotChangeUP(const QString & pass){
    this->Step=Tspl_login_std_mng::ValidUserPassU;
    // посылаем асинхронный запрос в базу, проверка соответствие пользователя с его паролем
    QList<QVariant> aa;
    aa.append(this->mcurruser);
    aa.append(pass);
    emit this->sigPutLog(PLUGIN_NAME,2,"Send query validate current password for user");
    emit this->sigQexec(PLUGIN_NAME,"validate_userpass",aa);

}

// режим админа
// запрос всех пользователей в системе
void Tspl_login_std_mng::slotGetAllUsers(){
    // этап 2 для админского модуля, получение списка пользователей.
    this->Step=Tspl_login_std_mng::GetAllUsersAdm;
    emit this->sigPutLog(PLUGIN_NAME,2,"Send query list all users");
    // ну собственно и сам запрос всех юзеров ...
    QList<QVariant> aa;
    emit this->sigQexec(PLUGIN_NAME,"get_all_users",aa);
}

void Tspl_login_std_mng::slotDb(const QString &plName, int id,  QSqlQuery *ret){
    QStringList users;
    if(plName==PLUGIN_NAME){
        emit this->sigPutLog(PLUGIN_NAME,2,"Success reply");
        switch(this->Step){
        case Tspl_login_std_mng::ValidUserPassU:
            // получен верный ответ от бд на этапе валидации пользователя
            // проверяем содержимое
            emit this->sigPutLog(PLUGIN_NAME,2,"Recive validation");
            ret->next();
            if(!ret->value(0).toBool()){
                // валидация не прошла, отдаем это диалогу
                emit this->sigPutLog(PLUGIN_NAME,2,"Validation is fail");
                this->dia->setValidationErrorU();
            }else{
                // валидация прошла начинаем смену пароля
                emit this->sigPutLog(PLUGIN_NAME,2,"Validation is success");
                this->Step=Tspl_login_std_mng::ChangePassU;
                QList<QVariant> aa;
                aa.append(this->dia->getNewPass());
                aa.append(this->mcurruser);
                emit this->sigPutLog(PLUGIN_NAME,2,"Send query change password to user");
                emit this->sigQexec(PLUGIN_NAME,"change_userpass",aa);
            }
            // подчищаем за собой очередь ответов в базе
            emit this->sigClear(id);
            break;
        case Tspl_login_std_mng::ChangePassU:
            emit this->sigPutLog(PLUGIN_NAME,2,"Recive change password to user is success");
            // смена пароля прошла удачно
            // теперь возвращаемся на начальный этап в пользовательском режиме
            this->Step=Tspl_login_std_mng::InitUser;
            this->dia->setChangePassOkU();
            break;
        case Tspl_login_std_mng::GetAllUsersAdm:
            emit this->sigPutLog(PLUGIN_NAME,2,"Recive users list");
            // получили список пользователей
            // отдаем его диалогу
            while(ret->next()){
                users.append(ret->value(0).toString());
            }
            // подчищаем за собой очередь ответов в базе
            emit this->sigClear(id);
            this->dia->setGetAllUsersOkA(users);
            break;
        case Tspl_login_std_mng::ChangePassUA:
            emit this->sigPutLog(PLUGIN_NAME,2,"Recive change password to user is success");
            // смена пароля прошла удачно
            // теперь возвращаемся на начальный этап в пользовательском режиме
            this->Step=Tspl_login_std_mng::InitAdm;
            this->dia->setChangePassOkUA();
            break;
        default:
            break;
        }
    }
}

void Tspl_login_std_mng::slotDbErr(const QString &plName, const QString &errtext){
    if(plName==PLUGIN_NAME){
        emit this->sigPutLog(PLUGIN_NAME,2,"Fail reply");
        switch(this->Step){
        case Tspl_login_std_mng::ValidUserPassU:
            emit this->sigPutLog(PLUGIN_NAME,2,"Validation is fail");
            // возникла ошибка во время запроса валидации. скажем об этом диалогу
            // смена пароля не удалась, значит возвращаем все сноля
            this->Step=Tspl_login_std_mng::InitUser;
            this->dia->setValidationErrorUE(errtext);
            break;
        case Tspl_login_std_mng::ChangePassU:
            emit this->sigPutLog(PLUGIN_NAME,2,"Recive change password to user is fail");
            // произошла ошибка запроса смены пароля в режиме пользователя, стучим диалогу
            // смена пароля не удалась, значит возвращаем все сноля
            this->Step=Tspl_login_std_mng::InitUser;
            this->dia->setChangePassErrU(errtext);
            break;
        case Tspl_login_std_mng::GetAllUsersAdm:
            // опапа произошла ошибка получения всех юзверей.
            emit this->sigPutLog(PLUGIN_NAME,2,"Recive users list is fail");
            this->dia->setGetAllUsersErrA(errtext);
            break;
        case Tspl_login_std_mng::ChangePassUA:
            emit this->sigPutLog(PLUGIN_NAME,2,"Recive change password to user is fail");
            // произошла ошибка запроса смены пароля в режиме пользователя, стучим диалогу
            // смена пароля не удалась, значит возвращаем все сноля
            this->Step=Tspl_login_std_mng::InitAdm;
            this->dia->setChangePassErrUA(errtext);
            break;
        default:
            break;
        }
    }
}

// запрос смены пользователю пароля, режим админа
void Tspl_login_std_mng::slotChangeUPA(const QString & pass, const QString & user){
    // начинаем работать с бд, посылаем запрос
    this->Step=Tspl_login_std_mng::ChangePassUA;
    emit this->sigPutLog(PLUGIN_NAME,2,"Send query change password to user in adm mode");
    QList<QVariant> aa;
    aa.append(pass);
    aa.append(user);
    emit this->sigQexec(PLUGIN_NAME,"change_userpass",aa);
}

QString Tspl_login_std_mng::getName(){
    return tr("standart login managment");
}

// синхронный режим. в стандартном исполнении он не нужен. но может пригодиться.
// так что здесь просто заглушко
void Tspl_login_std_mng::slotRstartS(const QString pl_name){}
// ответ положительный с данными по запросу.
void Tspl_login_std_mng::slotFinishS(const QString & plName , QSqlQuery * ret){}
// ответ отрицательный с данными по ошибке
void Tspl_login_std_mng::slotFinishErrS(const QString & plName , const QString & errtext){}



Q_EXPORT_PLUGIN2(TsIfaceWrkPlugin,Tspl_login_std_mng)
